package gframework.bean;

import gframework.bean.combo.GComboBox;
import gframework.bean.consultaCampo.GConsultaCampo;
import gframework.bean.internalFrame.GInternalFrame;
import gframework.bean.passwordField.GPasswordField;
import gframework.bean.textArea.GTextArea;
import gframework.bean.textField.GTextField;
import gframework.remote.ItemComboVO;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Properties;
import java.util.TimeZone;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class Util {

    public static String getPropertie(String i_file, String i_valor) throws Exception {
        File file = new File("conf/hyperdiz.properties");
        Properties prop = new Properties();

        FileInputStream fis = new FileInputStream(file);
        prop.load(fis);
        fis.close();

        return prop.getProperty(i_valor);
    }
    public final static String MSG_NENHUM_ITEM_SELECIONADO = "Nenhum item selecionado!";
    public final static String MSG_REGISTRO_NAO_ENCONTRADO = "Registro(s) não encontrado(s)!";
    public final static String MSG_OPERACAO_CANCELADA = "Operação cancelada!";
    public final static String MSG_CANCELADO_COM_SUCESSO = "Cancelado com sucesso!";
    public final static String MSG_IMPORTADO_COM_SUCESSO = "Importado com sucesso!";
    public final static String MSG_EXPORTADO_COM_SUCESSO = "Exportado com sucesso!";
    public final static String MSG_IMPRESSO_COM_SUCESSO = "Impresso com sucesso!";
    public final static String MSG_CONFIRMA_EXCLUSAO = "Confirma exclusão?";
    public final static String MSG_SALVO_SUCESSO = "Salvo com sucesso!";
    public final static Color COR_VERIFICA = new Color(255, 187, 187);
    public final static Color COR_ZEBRADO = new Color(236, 237, 240);
    public final static Color COR_TOTAL = new Color(51, 0, 255);
    public final static Border BORDA_AZUL = BorderFactory.createLineBorder(new Color(236, 237, 240));
    public final static Border BORDA_BRANCA = BorderFactory.createLineBorder(new Color(255, 255, 255));

    public static void exibirMensagemConfirmar(String i_mensagem, String i_title) throws Exception {
        Object[] options = {"Sim", "Não"};

        int i = JOptionPane.showOptionDialog(null, i_mensagem, i_title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
                null, options, options[1]);

        if (i != JOptionPane.YES_OPTION) {
            throw new Exception(MSG_OPERACAO_CANCELADA);
        }
    }

    public static void exibirMensagemContinuar(String i_mensagem, String i_title) throws Exception {
        Object[] options = {"Ok", "Cancelar"};

        int i = JOptionPane.showOptionDialog(null, i_mensagem, i_title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE,
                null, options, options[1]);

        if (i != JOptionPane.OK_OPTION) {
            throw new Exception(MSG_OPERACAO_CANCELADA);
        }
    }

    public static void exibirMensagemErro(Exception i_ex) {
        JOptionPane.showMessageDialog(null, i_ex.getMessage(), "Atenção - Erro", JOptionPane.WARNING_MESSAGE);
        
    }
    public static void exibirMensagemErro(String i_mensagem, String i_title) {
        if (i_mensagem == null) {
            i_mensagem = "null";
        }

        if (i_mensagem.equals(MSG_OPERACAO_CANCELADA)) {
            return;
        }

        JOptionPane.showMessageDialog(null, i_mensagem, i_title, JOptionPane.WARNING_MESSAGE);
    }

    public static void exibirMensagem(String i_mensagem, String i_titulo) throws Exception {
        JOptionPane.showMessageDialog(null, i_mensagem, i_titulo, JOptionPane.INFORMATION_MESSAGE);
    }

    public static void exibirMensagemFinalizadoSucesso() throws Exception {
        JOptionPane.showMessageDialog(null, "Finalizado com sucesso", "Atenção", JOptionPane.INFORMATION_MESSAGE);
    }
    
    public static void exibirMensagemSalvoSucesso() throws Exception {
        JOptionPane.showMessageDialog(null, "Salvo com sucesso", "Atenção", JOptionPane.INFORMATION_MESSAGE);
    }

    public static void carregarComboMes(GComboBox i_combo, boolean i_decimoTerceiro) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuffer sql = null;

        i_combo.removeAllItems();

        stm = Conexao.createStatement();

        sql = new StringBuffer();
        sql.append("SELECT * FROM mes ");

        if (!i_decimoTerceiro) {
            sql.append("WHERE id <= 12 ");
        }

        sql.append("ORDER BY id");

        rst = stm.executeQuery(sql.toString());

        while (rst.next()) {
            ItemComboVO oItemCombo = new ItemComboVO();
            oItemCombo.descricao = rst.getString("descricao");
            oItemCombo.id = rst.getInt("id");

            i_combo.addItem(oItemCombo);
        }

        stm.close();
    }

    public static void carregarComboAno(GComboBox i_combo) throws Exception {

        for (int i = 0; i < 6; i++) {
            ItemComboVO oItemCombo = new ItemComboVO();
            int ano = Integer.parseInt(Util.getDataAtual().substring(6, 10)) + 1;

            oItemCombo.descricao = String.valueOf(ano - i);
            oItemCombo.id = i;

            i_combo.addItem(oItemCombo);
        }
    }

    public static String formatDataBanco(String i_data) throws Exception {
        return new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));
    }

    public static String formatDataGUI(Date i_data) throws Exception {
        return new SimpleDateFormat("dd/MM/yyyy").format(i_data);
    }

    public static String formatDataHoraGUI(Date i_dataHora) throws Exception {
        return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(i_dataHora);
    }

    public static String formatDataHoraBanco(String i_dataHora) throws Exception {
        try {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(i_dataHora));
        } catch (Exception ex) {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(i_dataHora));
        }
    }

    public static String formatMesAno(String i_data) throws Exception {
        return i_data.substring(3);
    }

    public static String formatHoraGUI(Date i_data) throws Exception {
        return new SimpleDateFormat("HH:mm:ss").format(i_data);
    }

    public static String formatDiaSemana(String i_data) throws Exception {
        return Util.formatDiaSemana(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));
    }

    public static String formatDiaSemana(Date i_data) throws Exception {
        return new SimpleDateFormat("EEEE").format(i_data).replace("á", "a").replace("ç", "c").toUpperCase();
    }

    public static int getDiaSemana(String i_data) throws Exception {
        String diaSemana = formatDiaSemana(i_data);

        if (diaSemana.equals("DOMINGO")) {
            return 1;
        } else if (diaSemana.equals("SEGUNDA-FEIRA")) {
            return 2;
        } else if (diaSemana.equals("TERCA-FEIRA")) {
            return 3;
        } else if (diaSemana.equals("QUARTA-FEIRA")) {
            return 4;
        } else if (diaSemana.equals("QUINTA-FEIRA")) {
            return 5;
        } else if (diaSemana.equals("SEXTA-FEIRA")) {
            return 6;
        } else if (diaSemana.equals("SABADO")) {
            return 7;
        } else {
            return 0;
        }

    }

    public static String formatDiaSemana(int i_dia) throws Exception {
        switch (i_dia) {
            case 1:
                return "DOMINGO";
            case 2:
                return "SEGUNDA-FEIRA";
            case 3:
                return "TERCA-FEIRA";
            case 4:
                return "QUARTA-FEIRA";
            case 5:
                return "QUINTA-FEIRA";
            case 6:
                return "SEXTA-FEIRA";
            case 7:
                return "SABADO";
            default:
                return "";
        }
    }

    public static boolean isCPFValido(String i_cpf) throws Exception {
        String cpf = new DecimalFormat("00000000000").format(Double.parseDouble(i_cpf.replace(".", "").replace("-", "")));
        int digito = Integer.parseInt(cpf.substring(9, 11));

        int digito1 = 0;

        int soma1 = 0;
        int soma2 = 0;

        int valor = 11;

        for (int i = 0; i < 9; i++) {
            soma1 += Integer.parseInt(cpf.substring(i, i + 1)) * (valor - 1);
            soma2 += Integer.parseInt(cpf.substring(i, i + 1)) * valor;

            valor--;
        }

        soma1 = ((soma1 * 10) % 11) == 10 ? 0 : ((soma1 * 10) % 11);
        soma2 = ((soma2 + (2 * soma1)) * 10) % 11;

        digito1 = (soma1 * 10) + soma2;

        return (digito1 == digito);
    }

    public static boolean isDataValida(String i_data) throws Exception {
        try {
            String data = new SimpleDateFormat("dd/MM/yyyy").format(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));

            if (data.equals(i_data)) {
                return true;
            } else {
                return false;
            }

        } catch (Exception ex) {
            return false;
        }
    }

    public static boolean isMesAnoValido(String i_data) throws Exception {
        try {
            String data = new SimpleDateFormat("MM/yyyy").format(new SimpleDateFormat("MM/yyyy").parse(i_data));

            if (data.equals(i_data)) {
                return true;
            } else {
                return false;
            }

        } catch (Exception ex) {
            return false;
        }
    }

    public static boolean isAutomacaoValido(long i_codigo) throws Exception {
        String codigo = formatNumber(i_codigo, 13);

        int somaPar = 0;
        int somaImpar = 0;

        for (int i = 0; i < 12; i += 2) {
            somaImpar += Integer.parseInt(String.valueOf(codigo.charAt(i)));
            somaPar += Integer.parseInt(String.valueOf(codigo.charAt(i + 1)));
        }

        int soma = somaImpar + (3 * somaPar);
        int digito = 0;
        int calculo = 0;

        do {
            calculo = soma % 10;

            if (calculo != 0) {
                digito += 1;
                soma += 1;
            }
        } while (calculo != 0);

        if (digito != Integer.parseInt(String.valueOf(codigo.charAt(12)))) {
            return false;
        } else {
            return true;
        }
    }

    public static boolean isDun14Valido(long i_codigo) throws Exception {
        return true;
    }

    public static boolean isEmailValido(String i_email) throws Exception {
        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        Matcher m = p.matcher(i_email);

        boolean value = m.matches();

        if (value) {
            return true;
        } else {
            return false;
        }
    }

    public static long gerarCodigoAutomacao(long i_codigo) throws Exception {
        String codigo = formatNumber(i_codigo, 12);

        int somaPar = 0;
        int somaImpar = 0;

        for (int i = 0; i < 12; i += 2) {
            somaImpar += Integer.parseInt(String.valueOf(codigo.charAt(i)));
            somaPar += Integer.parseInt(String.valueOf(codigo.charAt(i + 1)));
        }

        int soma = somaImpar + (3 * somaPar);
        int digito = 0;
        int calculo = 0;

        do {
            calculo = soma % 10;

            if (calculo != 0) {
                digito += 1;
                soma += 1;
            }
        } while (calculo != 0);

        return Long.parseLong(codigo + digito);
    }

    static public boolean isCNPJValido(String i_cnpj) throws Exception {
        String Cnpj = new DecimalFormat("00000000000000").format(Double.parseDouble(i_cnpj.replace(".", "").replace("/", "").replace("-", "")));
        int digito = Integer.parseInt(Cnpj.substring(12, 14));

        int digito1 = 0;
        int digito2 = 0;

        int valida[] = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};

        for (int i = 0; i < valida.length; i++) {
            digito1 += i > 0 ? (Integer.parseInt(Cnpj.substring(i - 1, i)) * valida[i]) : 0;
            digito2 += Integer.parseInt(Cnpj.substring(i, i + 1)) * valida[i];
        }

        digito1 = ((digito1 % 11) < 2) ? 0 : (11 - (digito1 % 11));
        digito2 = (((digito2 % 11) < 2) ? 0 : (11 - (digito2 % 11)));

        return (((digito1 * 10) + digito2) == digito);
    }

    public static boolean isIntervaloData(String i_dataInicio, String i_dataTermino) throws ParseException {
        if ((new SimpleDateFormat("dd/MM/yyyy").parse(i_dataInicio).getTime()) > (new SimpleDateFormat("dd/MM/yyyy").parse(i_dataTermino).getTime())) {
            return false;
        } else {
            return true;
        }
    }

    public static boolean validaChave() throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuffer sql = null;
        String valor = "";

        stm = Conexao.createStatement();

        sql = new StringBuffer();
        sql.append("SELECT valor FROM chave");

        rst = stm.executeQuery(sql.toString());

        while (rst.next()) {
            valor = rst.getString("valor");
        }

        stm.close();

        if (valor.equals("alkjdshflaiusydfapishdfkqwherlkqhwe")) {
            return true;
        } else {
            return false;
        }
    }

    public static void validarCampoTela(Vector<Object> i_campo) throws Exception {
        boolean temErro = false;
        Object campoFoco = null;

        for (Object oCampo : i_campo) {
            if (oCampo instanceof GTextField) {
                GTextField txtCampo = (GTextField) oCampo;

                if (txtCampo.getClipText().equals("")) {
                    txtCampo.setBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof GTextArea) {
                GTextArea txtCampo = (GTextArea) oCampo;

                if (txtCampo.getText().equals("")) {
                    txtCampo.setTextBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof GPasswordField) {
                GPasswordField pswCampo = (GPasswordField) oCampo;

                if (pswCampo.getText().equals("")) {
                    pswCampo.setBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof GComboBox) {
                GComboBox cboCampo = (GComboBox) oCampo;

                if (!cboCampo.isCheckBox()) {
                    if (cboCampo.getId() == -1) {
                        cboCampo.setBackground(COR_VERIFICA);
                        temErro = true;

                        if (campoFoco == null) {
                            campoFoco = oCampo;
                        }
                    }
                }
            } else if (oCampo instanceof GConsultaCampo) {
                GConsultaCampo cnsCampo = (GConsultaCampo) oCampo;

                if (cnsCampo.getId() == -1) {
                    cnsCampo.setCodigoBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            }
        }

        if (temErro) {
            ((Component) campoFoco).requestFocus();
            throw new Exception("Campo(s) preenchido(s) incorretamente!");
        }

    }

    public static void validarCampoTela(List<Object> i_campo) throws Exception {
        boolean temErro = false;
        Object campoFoco = null;

        for (Object oCampo : i_campo) {
            if (oCampo instanceof GTextField ) {
                GTextField txtCampo = (GTextField) oCampo;

                if (txtCampo.getClipText().equals("")) {
                    txtCampo.setBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof JTextField ) {
                JTextField txtCampo = (JTextField) oCampo;

                if (txtCampo.getText().equals("")) {
                    txtCampo.setBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof GTextArea) {
                GTextArea txtCampo = (GTextArea) oCampo;

                if (txtCampo.getText().equals("")) {
                    txtCampo.setTextBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof GPasswordField) {
                GPasswordField pswCampo = (GPasswordField) oCampo;

                if (pswCampo.getText().equals("")) {
                    pswCampo.setBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            } else if (oCampo instanceof GComboBox) {
                GComboBox cboCampo = (GComboBox) oCampo;

                if (!cboCampo.isCheckBox()) {
                    if (cboCampo.getId() == -1) {
                        cboCampo.setBackground(COR_VERIFICA);
                        temErro = true;

                        if (campoFoco == null) {
                            campoFoco = oCampo;
                        }
                    }
                }
            } else if (oCampo instanceof GConsultaCampo) {
                GConsultaCampo cnsCampo = (GConsultaCampo) oCampo;

                if (cnsCampo.getId() == -1) {
                    cnsCampo.setCodigoBackground(COR_VERIFICA);
                    temErro = true;

                    if (campoFoco == null) {
                        campoFoco = oCampo;
                    }
                }
            }
        }

        if (temErro) {
            ((Component) campoFoco).requestFocus();
            throw new Exception("Campo(s) preenchido(s) incorretamente!");
        }

    }

//    public static void validarFiltro(Vector<Object> i_campo) throws Exception {
//        boolean achou = false;
//        Object campoFoco = null;
//
//        for (Object oCampo : i_campo) {
//            if (oCampo instanceof GTextField) {
//                GTextField txtCampo = (GTextField) oCampo;
//
//                if (campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if (!txtCampo.getClipText().equals("")) {
//                    achou = true;
//                    break;
//                }
//            } else if (oCampo instanceof VRComboBox) {
//                VRComboBox cboCampo = (VRComboBox) oCampo;
//
//                if (campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if (!cboCampo.isCheckBox()) {
//                    if (cboCampo.getId() != -1) {
//                        achou = true;
//                        break;
//                    }
//                } else {
//                    for (int i = 0; i < cboCampo.getItemCount(); i++) {
//                        if (cboCampo.isSelecionado(i)) {
//                            achou = true;
//                            break;
//                        }
//                    }
//
//                    if (achou) {
//                        break;
//                    }
//                }
//            } else if (oCampo instanceof VRConsultaCampo) {
//                VRConsultaCampo cnsCampo = (VRConsultaCampo) oCampo;
//
//                if (campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if (cnsCampo.getId() != -1) {
//                    achou = true;
//                    break;
//                }
//            } else if (oCampo instanceof VRConsultaNcm) {
//                VRConsultaNcm cnsCampo = (VRConsultaNcm) oCampo;
//
//                if (campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if (cnsCampo.getNcm1() != -1) {
//                    achou = true;
//                    break;
//                }
//            } else if (oCampo instanceof VRConsultaMercadologico) {
//                VRConsultaMercadologico cnsCampo = (VRConsultaMercadologico) oCampo;
//
//                if (campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if (cnsCampo.getMercadologico1() != -1) {
//                    achou = true;
//                    break;
//                }
//            } else if (oCampo instanceof VRCalendar) {
//                VRCalendar txtCampo = (VRCalendar) oCampo;
//
//                if (campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if (!txtCampo.getClipText().equals("")) {
//                    achou = true;
//                    break;
//                }
//            } else if (oCampo instanceof VRPeriodo) {
//                VRPeriodo txtPeriodo = (VRPeriodo) oCampo;
//
//                if(campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if(!txtPeriodo.getDataInicio().equals("") && !txtPeriodo.getDataTermino().equals("")) {
//                    achou = true;
//                    break;
//                }
//            } else if (oCampo instanceof VRConsultaProduto) {
//                VRConsultaProduto cnsProduto = (VRConsultaProduto) oCampo;
//
//                if(campoFoco == null) {
//                    campoFoco = oCampo;
//                }
//
//                if(cnsProduto.getId() != -1) {
//                    achou = true;
//                    break;
//                }
//            }
//        }
//
//        if (!achou) {
//            ((Component) campoFoco).requestFocus();
//            throw new Exception("Digite um campo para consulta!");
//        }
//    }
    /**
     * Verifica se o intervalo entre as datas é valido
     *
     * @param i_dataInicio - VRCalendar início
     * @param i_dataTermino = VRCalendar termino
     * @throws java.lang.Exception
     */
//    public static void validarIntervaloData(VRCalendar i_txtInicio, VRCalendar i_txtTermino) throws Exception {
//        if (!Util.isIntervaloData(i_txtInicio.getText(), i_txtTermino.getText())) {
//            i_txtInicio.requestFocus();
//            throw new Exception("Período inválido!");
//        }
//    }
    public static String formatCPF(long i_cpf) {
        String cpf = new DecimalFormat("00000000000").format(i_cpf);

        return cpf.substring(0, 3) + "." + cpf.substring(3, 6) + "." + cpf.substring(6, 9) + "-" + cpf.substring(9, 11);
    }

    public static String formatCNPJ(long i_cpf) {
        String cpf = new DecimalFormat("00000000000000").format(i_cpf);

        return cpf.substring(0, 2) + "." + cpf.substring(2, 5) + "." + cpf.substring(5, 8) + "/" + cpf.substring(8, 12) + "-" + cpf.substring(12, 14);
    }

    public static String formatDecimal0(double i_valor) {
        return new DecimalFormat("###,##0").format(i_valor);
    }

    public static String formatDecimal1(double i_valor) {
        return new DecimalFormat("###,##0.0").format(i_valor);
    }

    public static String formatDecimal2(double i_valor) {
        return new DecimalFormat("###,##0.00").format(i_valor);
    }

    public static String formatDecimal3(double i_valor) {
        return new DecimalFormat("###,##0.000").format(i_valor);
    }

    public static String formatDecimal4(double i_valor) {
        return new DecimalFormat("###,##0.0000").format(i_valor);
    }

    public static String formatCusto(double i_valor) {
        return new DecimalFormat("###,##0.00#").format(i_valor);
    }

    public static String getDataAtual() throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuffer sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuffer();

        sql.append("SELECT TO_CHAR(NOW(), 'dd/mm/yyyy') AS data");

        rst = stm.executeQuery(sql.toString());
        rst.next();

        return rst.getString("data");

    }

    public static long getTime(String i_data) throws Exception {
        try {
            return new SimpleDateFormat("dd/MM/yyyy").parse(i_data).getTime();
        } catch (Exception ex) {
            try {
                return new SimpleDateFormat("HH:mm:ss").parse(i_data).getTime();
            } catch (Exception ex2) {
                return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(i_data).getTime();
            }
        }
    }

    /**
     *
     * @param i_data1 dd/MM/yyyy
     * @param i_data2 dd/MM/yyyy
     * @param i_tipo d - dia, m - mes, a - ano
     * @return
     * @throws java.lang.Exception
     */
    public static long dateDiff(String i_data1, String i_data2, String i_tipo) throws Exception {

        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        formatter.setTimeZone(TimeZone.getTimeZone("GMT-03:00"));

        long time1 = formatter.parse(i_data1).getTime();
        long time2 = formatter.parse(i_data2).getTime();

        if (i_tipo.toLowerCase().equals("d")) {
            return (time2 - time1) / (1000 * 60 * 60 * 24);

        } else if (i_tipo.toLowerCase().equals("m")) {
            return (time2 - time1) / (1000 * 60 * 60 * 24) / 30;

        } else if (i_tipo.toLowerCase().equals("a")) {
            return (time2 - time1) / (1000 * 60 * 60 * 24) / 365;

        } else {
            throw new Exception("Tipo inválido!");
        }

    }

    public static String getDataHoraAtual() throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuffer sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuffer();

        sql.append("SELECT TO_CHAR(NOW(), 'dd/mm/yyyy hh24:mi:ss') AS datahora");

        rst = stm.executeQuery(sql.toString());
        rst.next();

        return rst.getString("datahora");
    }

    public static String getHoraAtual() throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuffer sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuffer();

        sql.append("SELECT TO_CHAR(NOW(), 'HH24:mi:ss') AS hora");

        rst = stm.executeQuery(sql.toString());
        rst.next();

        return rst.getString("hora");
    }

    /**
     * adiciona valor a uma data
     *
     * @param i_data data a ser alterada
     * @param i_tipo "d" = dia, "m" = mes, "a" = ano
     * @param i_qtde valor a ser adicionado
     * @return
     * @throws java.lang.Exception
     */
    public static String dateAdd(String i_data, String i_tipo, int i_qtde) throws Exception {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(new SimpleDateFormat("dd/MM/yyyy").parse(i_data));

        if (i_tipo.toUpperCase().equals("D")) {
            gc.add(Calendar.DAY_OF_MONTH, i_qtde);

        } else if (i_tipo.toUpperCase().equals("M")) {
            gc.add(Calendar.MONTH, i_qtde);

        } else if (i_tipo.toUpperCase().equals("A")) {
            gc.add(Calendar.YEAR, i_qtde);
        }

        return new SimpleDateFormat("dd/MM/yyyy").format(gc.getTime());
    }

    public static String formatNumber(String i_valor, int i_tamanho) {
        String zero = "";

        for (int i = 0; i < (i_tamanho - i_valor.length()); i++) {
            zero += "0";
        }

        return zero + i_valor;
    }

    public static String formatNumber(long i_valor, int i_tamanho) {
        return formatNumber(String.valueOf(i_valor), i_tamanho);
    }

    public static String formatString(String i_texto, int i_tamanho) throws Exception {
        String texto = "";

        if (i_texto.length() > i_tamanho) {
            texto = i_texto.substring(0, i_tamanho);
        } else {
            texto = i_texto;
        }

        String espaco = "";

        for (int i = 0; i < (i_tamanho - texto.length()); i++) {
            espaco += " ";
        }

        return texto + espaco;
    }

    public static boolean isHoraValida(String i_hora) throws Exception {
        try {
            String hora = new SimpleDateFormat("HH:mm:ss").format(new SimpleDateFormat("HH:mm:ss").parse(i_hora));

            if (hora.equals(i_hora)) {
                return true;
            } else {
                return false;
            }
        } catch (Exception ex) {
            try {
                String hora = new SimpleDateFormat("HH:mm").format(new SimpleDateFormat("HH:mm").parse(i_hora));

                if (hora.equals(i_hora)) {
                    return true;
                } else {
                    return false;
                }
            } catch (Exception ex2) {
                return false;
            }
        }
    }

    public static String getMd5(String i_texto) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        BigInteger hash = new BigInteger(1, md.digest(i_texto.getBytes()));

        return Util.formatNumber(hash.toString(16), 32);
    }

    /**
     * @deprecated Utilize this.setDefaultCursor
     * @param i_internalFrame
     * @throws java.lang.Exception
     */
    public static void setDefaultCursor(GInternalFrame i_internalFrame) throws Exception {
        i_internalFrame.setCursor(Cursor.getDefaultCursor());
    }

    /**
     * @deprecated Utilize this.setWaitCursor
     * @param i_internalFrame
     * @throws java.lang.Exception
     */
    public static void setWaitCursor(GInternalFrame i_internalFrame) throws Exception {
        i_internalFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    }

    public static double round(double i_valor, int i_qtd) throws Exception {
        String zero = "";

        for (int i = 0; i < i_qtd; i++) {
            zero += "0";
        }

        String valor = new DecimalFormat("###,##0." + zero).format(i_valor);

        return Double.parseDouble(valor.replace(".", "").replace(",", "."));
    }

    public static String getGoogle(String i_campo, String i_texto) throws Exception {
        String[] aPalavra = i_texto.split(" ");
        String retorno = "";

        for (int i = 0; i < aPalavra.length; i++) {
            if (!aPalavra[i].equals("")) {
                if (!retorno.equals("")) {
                    retorno += " AND ";
                }

                retorno += "(" + i_campo + " LIKE '" + aPalavra[i] + "%' OR " + i_campo + " LIKE '% " + aPalavra[i] + "%')";
            }
        }

        return "(" + retorno + ")";
    }

    public static String replaceAll(String valor) throws Exception {
        return valor.replace("Á", "A").replace("À", "A").replace("Ã", "A").replace("É", "E").replace("È", "E").replace("Í", "I").replace("Ì", "I").replace("Ó", "0").replace("Ò", "O").replace("Õ", "O").replace("Ú", "U").replace("Ù", "U").replace("Ç", "C");
    }

    public static String toProperCase(String s) {
        Pattern p = Pattern.compile("(^|\\W)([a-z])");
        Matcher m = p.matcher(s.toLowerCase());
        StringBuffer sb = new StringBuffer(s.length());

        while (m.find()) {
            m.appendReplacement(sb, m.group(1) + m.group(2).toUpperCase());
        }

        m.appendTail(sb);

        return sb.toString();
    }

    public static String getConfiguracao(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuffer sql = null;

        stm = Conexao.createStatement();
        rst = stm.executeQuery("SELECT valor FROM configuracao WHERE id = " + i_id);
        rst.next();

        return rst.getString("valor");
    }

    public static String getValorExtenso(double i_valor) {
        String extenso = "";
        String tipo = "";
        String parte1 = "";
        String valor = formatDecimal2(i_valor);
        int cont = valor.length();
        int i = 0;
        int somar = 1;

        if (i_valor <= 0) {
            return "";
        }

        while (i < cont) {
            somar = 1;
            if (valor.substring(i, i + 1).equals(",") == false && valor.substring(i, i + 1).equals(".") == false) {
                if (cont == 4 && i == 0) {
                    tipo = "unitario";
                } else if (cont == 4 && i == 2) {
                    tipo = "dezena";
                } else if (cont == 4 && i == 3) {
                    tipo = "unitario";
                } else if (cont == 5 && i == 0) {
                    tipo = "dezena";
                } else if (cont == 5 && i == 1) {
                    tipo = "unitario";
                } else if (cont == 5 && i == 3) {
                    tipo = "dezena";
                } else if (cont == 5 && i == 4) {
                    tipo = "unitario";
                } else if (cont == 6 && i == 0) {
                    tipo = "centena";
                } else if (cont == 6 && i == 1) {
                    tipo = "dezena";
                } else if (cont == 6 && i == 2) {
                    tipo = "unitario";
                } else if (cont == 6 && i == 4) {
                    tipo = "dezena";
                } else if (cont == 6 && i == 5) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 0) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 2) {
                    tipo = "centena";
                } else if (cont == 8 && i == 3) {
                    tipo = "dezena";
                } else if (cont == 8 && i == 4) {
                    tipo = "unitario";
                } else if (cont == 8 && i == 6) {
                    tipo = "dezena";
                } else if (cont == 8 && i == 7) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 0) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 1) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 3) {
                    tipo = "centena";
                } else if (cont == 9 && i == 4) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 5) {
                    tipo = "unitario";
                } else if (cont == 9 && i == 7) {
                    tipo = "dezena";
                } else if (cont == 9 && i == 8) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 0) {
                    tipo = "centena";
                } else if (cont == 10 && i == 1) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 2) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 4) {
                    tipo = "centena";
                } else if (cont == 10 && i == 5) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 6) {
                    tipo = "unitario";
                } else if (cont == 10 && i == 8) {
                    tipo = "dezena";
                } else if (cont == 10 && i == 9) {
                    tipo = "unitario";
                }

                if (tipo.equals("unitario")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        parte1 = "Um ";
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Dois ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Tres ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quatro ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Cinco ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Seis ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Sete ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oito ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Nove ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }

                if (tipo.equals("dezena")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        if (valor.substring(i, i + 2).equals("10")) {
                            parte1 = "Dez ";
                        } else if (valor.substring(i, i + 2).equals("11")) {
                            parte1 = "Onze ";
                        } else if (valor.substring(i, i + 2).equals("12")) {
                            parte1 = "Doze ";
                        } else if (valor.substring(i, i + 2).equals("13")) {
                            parte1 = "Treze ";
                        } else if (valor.substring(i, i + 2).equals("14")) {
                            parte1 = "Quatorze ";
                        } else if (valor.substring(i, i + 2).equals("15")) {
                            parte1 = "Quinze ";
                        } else if (valor.substring(i, i + 2).equals("16")) {
                            parte1 = "Dezesseis ";
                        } else if (valor.substring(i, i + 2).equals("17")) {
                            parte1 = "Dezesete ";
                        } else if (valor.substring(i, i + 2).equals("18")) {
                            parte1 = "Dezoito ";
                        } else if (valor.substring(i, i + 2).equals("19")) {
                            parte1 = "Dezenove ";
                        }
                        somar = 2;
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Vinte ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Trinta ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quarenta ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Cinquenta ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Sessenta ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Setenta ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oitenta ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Noventa ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }

                if (tipo.equals("centena")) {
                    if (valor.substring(i, i + 1).equals("1")) {
                        if (valor.substring(i, i + 3).equals("100")) {
                            parte1 = "Cem ";
                        } else {
                            parte1 = "Cento ";
                        }
                    } else if (valor.substring(i, i + 1).equals("2")) {
                        parte1 = "Duzentos ";
                    } else if (valor.substring(i, i + 1).equals("3")) {
                        parte1 = "Trezentos ";
                    } else if (valor.substring(i, i + 1).equals("4")) {
                        parte1 = "Quatrocentos ";
                    } else if (valor.substring(i, i + 1).equals("5")) {
                        parte1 = "Quinhentos ";
                    } else if (valor.substring(i, i + 1).equals("6")) {
                        parte1 = "Seiscentos ";
                    } else if (valor.substring(i, i + 1).equals("7")) {
                        parte1 = "Setecentos ";
                    } else if (valor.substring(i, i + 1).equals("8")) {
                        parte1 = "Oitocentos ";
                    } else if (valor.substring(i, i + 1).equals("9")) {
                        parte1 = "Novecentos ";
                    } else if (valor.substring(i, i + 1).equals("0")) {
                        parte1 = "";
                    }
                }

                if (i == 0 || valor.substring(i - 1, i).equals(",")) {
                    extenso = extenso + parte1;
                } else if (valor.substring(i, i + 1).equals("0") == false) {
                    if (extenso.equals("")) {
                        extenso = extenso + parte1;
                    } else {
                        extenso = extenso + "e " + parte1;
                    }
                }
            } else if (valor.substring(i, i + 1).equals(",")) {
                if (cont == 4 && Integer.parseInt(valor.substring(i - 1, i)) == 1) {
                    extenso = extenso + "Real ";
                } else if (cont > 4 || Integer.parseInt(valor.substring(i - 1, i)) > 1) {
                    extenso = extenso + "Reais ";
                }
            } else if (valor.substring(i, i + 1).equals(".")) {
                extenso = extenso + "Mil "; //se sim, acrescenta a palavra "Mil"
            }

            i = i + somar;

        }

        if (Integer.parseInt(valor.substring(cont - 2, cont)) > 1) {
            extenso = extenso + "Centavos"; //se sim, acrescenta a palavra Centavos
        } else if (Integer.parseInt(valor.substring(cont - 2, cont)) == 1) {
            extenso = extenso + "Centavo"; //se não, acrescenta a palavra Centavo
        }

        return extenso.trim();
    }

    public static boolean isNumero(String i_value) throws Exception{
        boolean valor = true;
        
        try {
            Double.parseDouble(i_value);
        } catch (Exception e) {
            valor = false;
        }
        
        return valor;
    }
}
